#include "sql.h"
#include <QtDebug>

Sql* Sql::instance = nullptr;
Sql::Sql()
{

}

Sql::~Sql()
{

}

void Sql::init()//连接sqlite
{
    m_db= QSqlDatabase::addDatabase("QMYSQL");
    m_db.setHostName("127.0.0.1");
    m_db.setDatabaseName("book");
    m_db.setUserName("root");
    m_db.setPassword("123456");
    m_db.open();
}

QVector<QStringList> Sql::getBook(QString strCondition)
{
    QSqlQuery q(m_db);
    QString strSql = QString("select * from books %1").arg(strCondition);

    QVector<QStringList> vec;
    bool res = q.exec(strSql);
    if(!res){
        qDebug()<<q.lastError().text();
    }
    else{
        int iCols = q.record().count();
        QStringList l;
        while(q.next()){
            l.clear();
            for(int i=0;i<iCols;i++){
                l<<q.value(i).toString();
            }
            vec.push_back(l);
        }
    }
    return vec;
}

void Sql::addBook(QStringList l)
{
    QSqlQuery q(m_db);

    QString strSql = QString("insert into books values(null,'%1','%2','%3',%4);")
                         .arg(l[1]).arg(l[2]).arg(l[3]).arg(l[4]);

    bool res = q.exec(strSql);
    if(!res){
        qDebug()<<q.lastError().text();
    }
}

void Sql::changeBook(QStringList l)
{
    QSqlQuery q(m_db);

    QString strSql = QString("update books set book_name='%1',book_category='%2',book_pbli='%3',book_count=%4 where book_id=%5;")
                         .arg(l[1]).arg(l[2]).arg(l[3]).arg(l[4]).arg(l[0]);

    bool res = q.exec(strSql);
    if(!res){
        qDebug()<<q.lastError().text();
    }
}

bool Sql::delBook(QString strId)
{
    QSqlQuery q(m_db);

    QString strSql = QString("delete from books where book_Id = %1").arg(strId);

    bool res = q.exec(strSql);
    if(!res){
        qDebug()<<q.lastError().text();
    }
    return res;
}

bool Sql::login_user(QString struser, QString strpass)
{
    QSqlQuery q(m_db);
    QString strSql =QString("select * from user where account='%1' and password = '%2';").arg(struser).arg(strpass);
    bool ret=q.exec(strSql);
    if(!ret)
    {
        qDebug()<<q.lastError().text();
    }else{
        ret=q.next();
        if(strpass==q.value(3).toString()){
            user_id = q.value(0).toInt();
            return true;
        }
    }
    return false;
}

void Sql::sentBook(QString Book_id,int User_id)
{
    QSqlQuery q(m_db);

    QString strSql = QString("insert into record values(null,%1,%2,current_date,date_add(current_date,interval 30 day),'借阅中');").arg(Book_id).arg(User_id);

    bool res = q.exec(strSql);
    if(!res){
        qDebug()<<q.lastError().text();
    }
}

bool Sql::login_master(QString struser,QString strpass)
{
    QSqlQuery q(m_db);
    QString strSql =QString("select * from admin where account='%1' and password = '%2';").arg(struser).arg(strpass);
    bool ret=q.exec(strSql);
    if(!ret)
    {
        qDebug()<<q.lastError().text();
    }
    ret=q.next();
    if(q.value(2).toString() == strpass){
        user_id = q.value(0).toInt();
        return true;
    }
    return false;
}


QVector<QStringList> Sql::getuser(QString strCondition)
{

    QSqlQuery query(m_db);
    QString strSql = QString("select * from user %1").arg(strCondition);
    QVector<QStringList> result;

    if (!query.exec(strSql))
    {
        qDebug() << "Query failed: " << query.lastError().text();
        return result; // 返回空向量
    }

    int columnCount = query.record().count();
    if (columnCount <= 0)
        return result; // 没有列，返回空向量

    while (query.next())
    {
        QStringList rowData;
        for (int i = 0; i < columnCount; ++i)
        {
            rowData << query.value(i).toString();
        }
        result.append(rowData);
    }
    return result;

}
void Sql::deuser(QString strid)
{
    QSqlQuery q(m_db);

    QString strSql = QString("delete from user where user_id= %1").arg(strid);

    bool res = q.exec(strSql);
    if(!res){
        qDebug()<<q.lastError().text();
    }
}


void Sql::adduser(QStringList l)
{
    QSqlQuery q(m_db);
    QString strSql = QString("insert into user values(null,'%1','%2','%3','%4','%5');")
                         .arg(l[1]).arg(l[2]).arg(l[3]).arg(l[4]).arg(l[5]);

    bool res = q.exec(strSql);
    if(!res){
        qDebug()<<q.lastError().text();
    }
}


void Sql::changeuser(QStringList l)
{
    QSqlQuery q(m_db);

    QString strSql = QString("update user set name='%1',password='%2',account='%3',contact_number='%4' ,admin_id_fk='%5' where user_id='%6';")
                         .arg(l[1]).arg(l[3]).arg(l[2]).arg(l[4]).arg(l[5]).arg(l[0]);
    bool res = q.exec(strSql);
    if(!res){
        qDebug()<<q.lastError().text();
    }
}


QVector<QStringList> Sql::getrecord(QString strCondition)
{
    QSqlQuery q(m_db);
    QString strSql = QString("select * from v3 %1").arg(strCondition);

    QVector<QStringList> vec;

    bool res = q.exec(strSql);
    if(!res){
        qDebug()<<q.lastError().text();
    }
    else{
        int iCols = q.record().count();
        QStringList l;
        while(q.next()){
            l.clear();
            for(int i=0;i<iCols;i++){
                l<<q.value(i).toString();
            }
            vec.push_back(l);
        }
    }
    return vec;
}

void Sql::rebook(QString strId)
{
    QSqlQuery q(m_db);

    QString strSql = QString("update record set flag='已归还' where id=%1").arg(strId);

    bool res = q.exec(strSql);
    if(!res){
        qDebug()<<q.lastError().text();
    }
}

void Sql::clrearecord(QString strId)
{
    QSqlQuery q(m_db);

    QString strSql = QString("delete from record where id=%1").arg(strId);
    bool res = q.exec(strSql);
    if(!res){
        qDebug()<<q.lastError().text();
    }
}


QVector<QStringList> Sql::getret(QString strCondition)//显示预约记录
{
    QSqlQuery q(m_db);
    QString strSql =QString("select * from appointed %1").arg(strCondition);
    QVector<QStringList> vec1;
    bool ll=q.exec(strSql);
    if(!ll)
    {
        qDebug()<<q.lastError().text();
    }
    else
    {
        int icols=q.record().count();
        QStringList t;
        while(q.next()){
            t.clear();
            for(int i=0;i<icols;i++){
                t<<q.value(i).toString();
            }
            vec1.push_back(t);
        }
    }
    return vec1;
}

void Sql::delres(QString strId)
{
    QSqlQuery q(m_db);
    QString strSql = QString("delete from appointed where door = '%1'").arg(strId);
    bool ll = q.exec(strSql);
    if(!ll){
        qDebug()<<q.lastError().text();
    }
}

void Sql::updatares(QStringList ldata)
{
    QSqlQuery q(m_db);
    QString strSql = QString("update appointed "
                             "set door = '%1', phone = '%2', app_date = '%3'"
                             "where userid = %4")
                         .arg(ldata[1])
                         .arg(ldata[2])
                         .arg(ldata[3])
                         .arg(ldata[0]);

    bool ret = q.exec(strSql);
    if(!ret){
        qDebug()<<q.lastError().text();
    }
}

void Sql::addres(QString id)
{
    QSqlQuery q(m_db);
    QString strSql = QString("insert into appointed values(userid,%1,phone,current_date,sta_time,end_time);")
                         .arg(id);
    bool res = q.exec(strSql);
    if(!res){
        qDebug()<<q.lastError().text();
    }
}

QVector<QStringList> Sql::getRoom(QString strCondition){
    QSqlQuery q(m_db);
    QString strSql = QString("select * from talk_room %1;").arg(strCondition);
    QVector<QStringList> vec;
    bool res = q.exec(strSql);
    if(!res){
        qDebug()<<q.lastError().text();
    }
    else{
        int iCols = q.record().count();
        QStringList l;
        while(q.next()){
            l.clear();
            for(int i=0;i<iCols;i++){
                l<<q.value(i).toString();
            }
            vec.push_back(l);
        }
    }
    return vec;
}

void Sql::addRoom(QStringList l)
{
    QSqlQuery q(m_db);
    QString strSql = QString("insert into talk_room values('%1','%2',%3,'%4','%5','%6');").arg(l[0]).arg(l[1]).arg(l[2]).arg(l[3]).arg(l[4]).arg(l[5]);
    bool res = q.exec(strSql);
    if(!res){
        qDebug()<<q.lastError().text();
    }
}

void Sql::altRoom(QStringList l)
{
    QSqlQuery q(m_db);

    QString strSql = QString("update talk_room set used='%1',large=%2,opentime='%3', closetime='%4',equipment='%5' where id='%6';")
                         .arg(l[1]).arg(l[2]).arg(l[3]).arg(l[4]).arg(l[5]).arg(l[0]);

    bool res = q.exec(strSql);
    if(!res){
        qDebug()<<q.lastError().text();
        return;
    }
}
void Sql::delRoom(QString str)
{
    QSqlQuery q(m_db);

    QString strSql = QString("delete from talk_room where id='%1';").arg(str);
    bool res = q.exec(strSql);
    if(!res){
        qDebug()<<q.lastError().text();
    }
}
